home *** CD-ROM | disk | FTP | other *** search
- package java.text;
-
- import java.util.Vector;
-
- public class RuleBasedCollator extends Collator {
- static int CHARINDEX = 1879048192;
- static int EXPANDCHARINDEX = 2113929216;
- static int CONTRACTCHARINDEX = 2130706432;
- static int UNMAPPED = -1;
- private static final int SHORT_MAX_VALUE = 32767;
- private static final int PRIMARYORDERINCREMENT = 65536;
- private static final int MAXIGNORABLE = 65536;
- private static final int SECONDARYORDERINCREMENT = 256;
- private static final int TERTIARYORDERINCREMENT = 1;
- static final int PRIMARYORDERMASK = -65536;
- static final int SECONDARYORDERMASK = 65280;
- static final int TERTIARYORDERMASK = 255;
- private static final int SECONDARYRESETMASK = 65535;
- private static final int IGNORABLEMASK = 65535;
- private static final int PRIMARYDIFFERENCEONLY = -65536;
- private static final int SECONDARYDIFFERENCEONLY = -256;
- private static final int INITIALTABLESIZE = 20;
- private static final int MAXKEYSIZE = 5;
- static int PRIMARYORDERSHIFT = 16;
- static int SECONDARYORDERSHIFT = 8;
- private static final int MAXTOKENLEN = 256;
- private static final int MAXRULELEN = 512;
- private static final int COLLATIONKEYOFFSET = 1;
- private boolean isFrenchSec = false;
- private String ruleTable;
- private CompactIntArray mapping;
- private Vector contractTable;
- private Vector expandTable;
- private transient MergeCollation mPattern;
- private transient boolean isOverIgnore = false;
- private transient int currentOrder;
- private transient short maxSecOrder;
- private transient short maxTerOrder;
- private transient char lastChar;
- private transient StringBuffer key = new StringBuffer(5);
- private transient int strengthResult = 3;
- private transient StringBuffer primResult = new StringBuffer(256);
- private transient StringBuffer secResult = new StringBuffer(256);
- private transient StringBuffer terResult = new StringBuffer(256);
-
- public RuleBasedCollator(String var1) throws ParseException {
- ((Collator)this).setStrength(2);
- this.build(var1);
- }
-
- public String getRules() {
- if (this.ruleTable == null) {
- this.ruleTable = this.mPattern.getPattern();
- this.mPattern = null;
- }
-
- return this.ruleTable;
- }
-
- public CollationElementIterator getCollationElementIterator(String var1) {
- return new CollationElementIterator(var1, this);
- }
-
- public int compare(String var1, String var2) {
- int var3 = 0;
- CollationElementIterator var4 = new CollationElementIterator(var2, this);
- CollationElementIterator var5 = new CollationElementIterator(var1, this);
- int var6 = 0;
- int var7 = 0;
- boolean var8 = true;
- boolean var9 = true;
- boolean var10 = true;
- boolean var11 = true;
-
- while(true) {
- if (var8) {
- var6 = var5.next();
- } else {
- var8 = true;
- }
-
- if (var9) {
- var7 = var4.next();
- } else {
- var9 = true;
- }
-
- if (var6 == -1 || var7 == -1) {
- break;
- }
-
- if (var10) {
- var6 = this.strengthOrder(var6);
- }
-
- if (var11) {
- var7 = this.strengthOrder(var7);
- }
-
- var10 = true;
- var11 = true;
- if (var6 == 2147418112) {
- var10 = false;
- }
-
- if (var7 == 2147418112) {
- var11 = false;
- }
-
- if (var6 != var7) {
- if (CollationElementIterator.primaryOrder(var6) == CollationElementIterator.primaryOrder(var7)) {
- var3 = this.checkSecTerDiff(var6, var7, var3);
- } else if (var6 == 0) {
- var9 = false;
- } else if (var7 == 0) {
- var8 = false;
- } else if (var6 < 65536) {
- if (var7 < 65536) {
- var3 = this.checkSecTerDiff(var6, var7, var3);
- } else {
- if (this.isFrenchSec || var3 == 0 || this.strengthResult != 1) {
- this.strengthResult = 1;
- var3 = 1;
- }
-
- var9 = false;
- }
- } else {
- if (var7 >= 65536) {
- if (CollationElementIterator.primaryOrder(var6) < CollationElementIterator.primaryOrder(var7)) {
- var3 = -1;
- } else {
- var3 = 1;
- }
- break;
- }
-
- if (this.isFrenchSec || var3 == 0 || this.strengthResult != 1) {
- var3 = -1;
- this.strengthResult = 1;
- }
-
- var8 = false;
- }
- }
- }
-
- if (var6 != -1 && var7 == -1) {
- if (this.isIgnorable(var6) && !this.isFrenchSec) {
- return var3;
- }
-
- if (this.strengthOrder(var6) != 0) {
- var3 = 1;
- }
- }
-
- if (var7 != -1 && var6 == -1) {
- if (this.isIgnorable(var7) && !this.isFrenchSec) {
- return var3;
- }
-
- if (this.strengthOrder(var7) != 0) {
- var3 = -1;
- }
- }
-
- return var3;
- }
-
- public CollationKey getCollationKey(String var1) {
- if (var1 == null) {
- return null;
- } else {
- this.primResult.setLength(0);
- this.secResult.setLength(0);
- this.terResult.setLength(0);
- int var2 = 0;
- boolean var3 = ((Collator)this).getStrength() >= 1;
- boolean var4 = ((Collator)this).getStrength() >= 2;
- short var5 = -1;
- short var6 = -1;
- CollationElementIterator var7 = new CollationElementIterator(var1, this);
-
- while((var2 = var7.next()) != -1) {
- var5 = CollationElementIterator.secondaryOrder(var2);
- var6 = CollationElementIterator.tertiaryOrder(var2);
- if (!this.isIgnorable(var2)) {
- this.primResult.append((char)(CollationElementIterator.primaryOrder(var2) + 1));
- if (var3) {
- this.secResult.append((char)(var5 + 1));
- }
-
- if (var4) {
- this.terResult.append((char)(var6 + 1));
- }
- } else {
- if (var3) {
- this.secResult.append((char)(var5 + this.maxSecOrder + 1));
- }
-
- if (var4) {
- this.terResult.append((char)(var6 + this.maxTerOrder + 1));
- }
- }
- }
-
- if (this.isFrenchSec) {
- this.reverse(this.secResult);
- this.reverse(this.terResult);
- }
-
- this.primResult.append('\u0000');
- this.secResult.append('\u0000');
- this.secResult.append(this.terResult.toString());
- this.primResult.append(this.secResult.toString());
- return new CollationKey(var1, this.primResult.toString());
- }
- }
-
- public Object clone() {
- RuleBasedCollator var1 = (RuleBasedCollator)super.clone();
- var1.primResult = new StringBuffer(256);
- var1.secResult = new StringBuffer(256);
- var1.terResult = new StringBuffer(256);
- var1.key = new StringBuffer(5);
- return var1;
- }
-
- public boolean equals(Object var1) {
- if (!super.equals(var1)) {
- return false;
- } else {
- RuleBasedCollator var2 = (RuleBasedCollator)var1;
- return this.getRules().equals(var2.getRules());
- }
- }
-
- public int hashCode() {
- return this.getRules().hashCode();
- }
-
- private void build(String var1) throws ParseException {
- this.mapping = new CompactIntArray(UNMAPPED);
- boolean var2 = false;
- if (var1.length() == 0) {
- throw new ParseException("Build rules empty.", 0);
- } else {
- var1 = DecompositionIterator.decompose(var1, ((Collator)this).getDecomposition());
- this.mPattern = new MergeCollation(var1);
-
- for(int var8 = 0; var8 < this.mPattern.getCount(); ++var8) {
- PatternEntry var5 = this.mPattern.getItemAt(var8);
- if (var5 != null) {
- String var4 = var5.getChars();
- if (var4.length() > 1 && var4.charAt(var4.length() - 1) == '@') {
- this.isFrenchSec = true;
- var4 = var4.substring(0, var4.length() - 1);
- }
-
- String var3 = var5.getExtension();
- if (var3.length() != 0) {
- this.addExpandOrder(var4, var3, var5.getStrength());
- } else if (var4.length() > 1) {
- this.addContractOrder(var4, var5.getStrength());
- this.lastChar = var4.charAt(0);
- } else {
- char var6 = var4.charAt(0);
- this.addOrder(var6, var5.getStrength());
- this.lastChar = var6;
- }
- }
- }
-
- this.commit();
- this.mapping.compact();
- }
- }
-
- private final void commit() {
- if (this.expandTable != null) {
- for(int var1 = 0; var1 < this.expandTable.size(); ++var1) {
- int[] var2 = (int[])this.expandTable.elementAt(var1);
-
- for(int var3 = 0; var3 < var2.length; ++var3) {
- if (var2[var3] < EXPANDCHARINDEX && var2[var3] > CHARINDEX) {
- char var4 = (char)(var2[var3] - CHARINDEX);
- int var5 = this.mapping.elementAt(var4);
- if (var5 == UNMAPPED) {
- var2[var3] = '\uffff' & var2[var3 - 1];
- } else if (var5 >= CONTRACTCHARINDEX) {
- Object var6 = null;
- Vector var7 = (Vector)this.contractTable.elementAt(var5 - CONTRACTCHARINDEX);
- EntryPair var8 = (EntryPair)var7.lastElement();
- var2[var3] = var8.value;
- } else {
- var2[var3] = var5;
- }
- }
- }
- }
- }
-
- }
-
- private final boolean isSpecialChar(char var1) {
- return var1 == '/' || var1 == ',' || var1 == ';' || var1 == '<' || var1 == '@' || var1 == '=';
- }
-
- private final int increment(int var1, int var2) {
- switch (var1) {
- case 0:
- var2 += 65536;
- var2 &= -65536;
- break;
- case 1:
- var2 += 256;
- var2 &= -256;
- if (this.isOverIgnore) {
- ++this.maxSecOrder;
- }
- break;
- case 2:
- ++var2;
- if (this.isOverIgnore) {
- ++this.maxTerOrder;
- }
- }
-
- return var2;
- }
-
- private final void addOrder(char var1, int var2) {
- int var3 = this.mapping.elementAt(var1);
- if (var3 == UNMAPPED) {
- this.currentOrder = this.increment(var2, this.currentOrder);
- this.mapping.setElementAt(var1, this.currentOrder);
- } else if (var3 < 0) {
- int var4 = var3 & '\uffff';
- int var5 = CONTRACTCHARINDEX + var4;
- this.key.setLength(0);
- this.key.append(var1);
- Vector var6 = this.getContractValues(var4);
- EntryPair var7 = new EntryPair();
- var7.entryName = this.key.toString();
- this.currentOrder = this.increment(var2, this.currentOrder);
- var7.value = this.currentOrder;
- this.mapping.setElementAt(var1, var5);
- var6.insertElementAt(var7, 0);
- } else {
- if (var3 > CONTRACTCHARINDEX) {
- this.key.setLength(0);
- this.key.append(var1);
- this.addContractOrder(this.key.toString(), var2);
- }
-
- }
- }
-
- private final void addContractOrder(String var1, int var2) {
- if (this.contractTable == null) {
- this.contractTable = new Vector(20);
- }
-
- this.key.setLength(0);
- this.key.append(var1.charAt(0));
- int var3 = UNMAPPED;
- Vector var4 = null;
- EntryPair var5 = new EntryPair();
-
- for(int var6 = 0; var6 < this.contractTable.size(); ++var6) {
- var4 = (Vector)this.contractTable.elementAt(var6);
- if ((var3 = this.getEntry(var4, this.key.toString())) != UNMAPPED) {
- break;
- }
- }
-
- int var7 = 0;
- if (var2 != 3) {
- var7 = this.increment(var2, this.currentOrder);
- } else {
- var7 = this.mapping.elementAt(var1.charAt(0));
- if (var7 == UNMAPPED) {
- this.currentOrder = this.mapping.elementAt(this.lastChar);
- var7 = this.increment(var2, this.currentOrder);
- }
- }
-
- if (var3 != UNMAPPED) {
- var5.entryName = var1;
- var5.value = var7;
- var4.insertElementAt(var5, 0);
- } else {
- Vector var8 = new Vector(20);
- int var9 = CONTRACTCHARINDEX + this.contractTable.size();
- int var10 = this.mapping.elementAt(var1.charAt(0));
- if (var10 == UNMAPPED) {
- Object var12 = null;
- this.mapping.setElementAt(var1.charAt(0), -65536 + this.contractTable.size());
- } else {
- var5.entryName = this.key.toString();
- this.mapping.setElementAt(var1.charAt(0), var9);
- var5.value = var10;
- var8.insertElementAt(var5, 0);
- }
-
- EntryPair var11 = new EntryPair();
- var11.entryName = var1;
- var11.value = var7;
- var8.insertElementAt(var11, 0);
- this.contractTable.insertElementAt(var8, this.contractTable.size());
- }
-
- if (var2 != 3) {
- this.currentOrder = var7;
- }
-
- }
-
- private final int getEntry(Vector var1, String var2) {
- for(int var3 = 0; var3 < var1.size(); ++var3) {
- EntryPair var4 = (EntryPair)var1.elementAt(var3);
- if (var4.entryName.equals(var2)) {
- return var3;
- }
- }
-
- return UNMAPPED;
- }
-
- Vector getContractValues(char var1) {
- int var2 = this.mapping.elementAt(var1);
- return this.getContractValues(var2 - CONTRACTCHARINDEX);
- }
-
- Vector getContractValues(int var1) {
- return var1 >= 0 ? (Vector)this.contractTable.elementAt(var1) : null;
- }
-
- private final void addExpandOrder(String var1, String var2, int var3) throws ParseException {
- EntryPair var4 = new EntryPair();
- if (this.expandTable == null) {
- this.expandTable = new Vector(20);
- }
-
- int[] var5 = new int[var2.length() + 1];
- int var6 = EXPANDCHARINDEX + this.expandTable.size();
- this.key.setLength(0);
- int var7 = UNMAPPED;
- if (var1.length() > 1) {
- this.addContractOrder(var1, var3);
- this.lastChar = var1.charAt(0);
- Vector var8 = this.getContractValues(var1.charAt(0));
- int var9 = UNMAPPED;
- var9 = this.getEntry(var8, var1);
- if (var9 != UNMAPPED) {
- var4 = (EntryPair)var8.elementAt(var9);
- var7 = var4.value;
- }
-
- var4.entryName = var1;
- var4.value = var6;
- } else {
- char var14 = var1.charAt(0);
- if (this.mapping.elementAt(var14) == UNMAPPED) {
- this.addOrder(var14, var3);
- this.lastChar = var14;
- }
-
- var7 = this.mapping.elementAt(this.lastChar);
- this.mapping.setElementAt(this.lastChar, var6);
- }
-
- var5[0] = var7;
-
- for(int var15 = 0; var15 < var2.length(); ++var15) {
- int var17 = this.mapping.elementAt(var2.charAt(var15));
- if (var17 >= CONTRACTCHARINDEX) {
- this.key.append(var2.charAt(var15));
- int var10 = CHARINDEX + var2.charAt(var15);
- Vector var11 = this.getContractValues(var2.charAt(var15));
- if (var11 != null) {
- int var12 = UNMAPPED;
- var12 = this.getEntry(var11, this.key.toString());
- if (var12 != UNMAPPED) {
- var4 = (EntryPair)var11.elementAt(var12);
- var10 = var4.value;
- }
- }
-
- this.key.setLength(0);
- var5[var15 + 1] = var10;
- } else if (var17 != UNMAPPED) {
- var5[var15 + 1] = var17;
- } else {
- var5[var15 + 1] = CHARINDEX + var2.charAt(var15);
- }
- }
-
- this.expandTable.insertElementAt(var5, this.expandTable.size());
- }
-
- final int[] getExpandValueList(char var1) {
- int var2 = this.mapping.elementAt(var1);
- if (var2 >= EXPANDCHARINDEX && var2 < CONTRACTCHARINDEX) {
- int var3 = var2 - EXPANDCHARINDEX;
- return (int[])this.expandTable.elementAt(var3);
- } else {
- return null;
- }
- }
-
- final int[] getExpandValueList(int var1) {
- return var1 < this.expandTable.size() ? (int[])this.expandTable.elementAt(var1) : null;
- }
-
- private final int strengthOrder(int var1) {
- if (((Collator)this).getStrength() == 0) {
- var1 &= -65536;
- } else if (((Collator)this).getStrength() == 1) {
- var1 &= -256;
- }
-
- return var1;
- }
-
- final boolean isIgnorable(int var1) {
- return CollationElementIterator.primaryOrder(var1) == 0;
- }
-
- final int getUnicodeOrder(char var1) {
- return this.mapping.elementAt(var1);
- }
-
- private final int checkSecTerDiff(int var1, int var2, int var3) {
- int var4 = var3;
- if (CollationElementIterator.secondaryOrder(var1) != CollationElementIterator.secondaryOrder(var2)) {
- if (this.isFrenchSec || var3 == 0 || this.strengthResult != 1) {
- this.strengthResult = 1;
- if (CollationElementIterator.secondaryOrder(var1) < CollationElementIterator.secondaryOrder(var2)) {
- var4 = -1;
- } else {
- var4 = 1;
- }
- }
- } else if (CollationElementIterator.tertiaryOrder(var1) != CollationElementIterator.tertiaryOrder(var2) && (var3 == 0 || this.isFrenchSec)) {
- this.strengthResult = 2;
- if (CollationElementIterator.tertiaryOrder(var1) < CollationElementIterator.tertiaryOrder(var2)) {
- var4 = -1;
- } else {
- var4 = 1;
- }
- }
-
- return var4;
- }
-
- private final void reverse(StringBuffer var1) {
- String var2 = var1.toString();
- var1.setLength(0);
-
- for(int var3 = var2.length() - 1; var3 >= 0; --var3) {
- var1.append(var2.charAt(var3));
- }
-
- }
- }
-